package org.springframework.context.support;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;

/**
 * @Name AbstractRefreshableApplicationContext
 * @Description: 支持刷新 Bean 工厂功能的上下文 [抽象] 实现类
 * 描述信息：该抽象类继承自 AbstractApplicationContext，更细粒度的 {模板方法} 设计模式，实现了刷新 Bean 工厂的一部分公共步骤（创建 BeanFactory 实例），并将另一部分个性化步骤（加载 BeanDefinition 信息）定义为抽象方法，交由子类进行实现。
 * @Version v1.0.0
 * @Author: lichao
 * @Date: 2024-03-19 19:35:09
 **/
public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext {
    private DefaultListableBeanFactory beanFactory;

    /**
     * 实现刷新容器功能：创建 BeanFactory 实例，并加载 BeanDefinition 信息。
     *
     * @version v1.0.0
     * @author lichao
     * @date 2024-03-19 19:37:50
     */
    protected final void refreshBeanFactory() throws BeansException {
        DefaultListableBeanFactory beanFactory = createBeanFactory();
        loadBeanDefinitions(beanFactory);
        this.beanFactory = beanFactory;
    }

    /**
     * 创建 Bean 工厂
     *
     * @return org.springframework.beans.factory.support.DefaultListableBeanFactory
     * @version v1.0.0
     * @author lichao
     * @date 2024-03-19 19:48:11
     */
    protected DefaultListableBeanFactory createBeanFactory() {
        return new DefaultListableBeanFactory();
    }

    /**
     * 加载 BeanDefinition 信息
     *
     * @param beanFactory Bean 容器
     * @version v1.0.0
     * @author lichao
     * @date 2024-03-19 19:47:49
     */
    protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory);

    public DefaultListableBeanFactory getBeanFactory() {
        return beanFactory;
    }
}

